package com.hera.base.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;

public class DateUtil {
	
	public static String LOCALE_NAME="es";

	
    public static String getFechaActual() {
        return getFecha(new Date(), "dd/MM/yyyy");
    }
    
    public static Date parseDate(String date,String format){
    	if(date==null) return null;
    	try{
    	  SimpleDateFormat formateador = new SimpleDateFormat(format,new Locale(LOCALE_NAME));
    	  return formateador.parse(date);
    	}catch (Exception e) {
    		e.printStackTrace();
		}
    	return null;
    }
    public static Date parseDateFormat(String date,String format) throws Exception{
		  if(date==null) return null;
		  SimpleDateFormat formateador = new SimpleDateFormat(format,new Locale(LOCALE_NAME));
		  return formateador.parse(date);
    }
    
    public static Date parseDate(String date){
    	return parseDate(date, "dd/MM/yyyy");
    }
    
    
    public static String getHoraFormat(Date ahora) {
    	if(ahora==null) return "";
        SimpleDateFormat formateador = new SimpleDateFormat("HH:mm:ss",new Locale(LOCALE_NAME));
        return formateador.format(ahora);
    }
    public static String getHoraMinutoFormat(Date ahora) {
    	if(ahora==null) return "";
        SimpleDateFormat formateador = new SimpleDateFormat("HH:mm",new Locale(LOCALE_NAME));
        return formateador.format(ahora);
    }
    public static String getFechaFormat(Date ahora) {
    	return getFechaFormat(ahora,"dd/MM/yyyy");
    }
    public static String getFechaFormat(Date ahora,String format) {
    	if(ahora==null) return  "";
        SimpleDateFormat formateador = new SimpleDateFormat(format,new Locale(LOCALE_NAME));
        return formateador.format(ahora);
    }
    
    public static String getFechaHoraFormat(Date ahora) {
    	try{
    		SimpleDateFormat formateador = new SimpleDateFormat("dd/MM/yyyy HH:mm",new Locale(LOCALE_NAME));
    		return formateador.format(ahora);
        }catch (Exception e) {
			return "";
		}
    }
    
    public static String getFecha(Date date){
        return getFecha(date,"dd/MM/yyyy");
    }
    
    public static String getFecha(Date date,String format){
    	try{
    		SimpleDateFormat formateador = new SimpleDateFormat(format,new Locale(LOCALE_NAME));
    		return formateador.format(date);
        }catch(Exception e){
        	return "";
        }
        
    }

    //Metodo usado para obtener la hora actual del sistema
    //@return Retorna un <b>STRING</b> con la hora actual formato "hh:mm:ss"
    public static String getHoraActual() {
        Date ahora = new Date();
        SimpleDateFormat formateador = new SimpleDateFormat("hh:mm:ss",new Locale(LOCALE_NAME));
        return formateador.format(ahora);
    }

    //Sumarle dias a una fecha determinada
    //@param fch La fecha para sumarle los dias
    //@param dias Numero de dias a agregar
    //@return La fecha agregando los dias
    public static java.sql.Date sumarFechasDias(java.sql.Date fch, int dias) {
        Calendar cal = new GregorianCalendar();
        cal.setTimeInMillis(fch.getTime());
        cal.add(Calendar.DATE, dias);
        return new java.sql.Date(cal.getTimeInMillis());
    }

    //Restarle dias a una fecha determinada
    //@param fch La fecha
    //@param dias Dias a restar
    //@return La fecha restando los dias
    public static synchronized java.sql.Date restarFechasDias(java.sql.Date fch, int dias) {
        Calendar cal = new GregorianCalendar();
        cal.setTimeInMillis(fch.getTime());
        cal.add(Calendar.DATE, -dias);
        return new java.sql.Date(cal.getTimeInMillis());
    }

    //Diferencias entre dos fechas
    //@param fechaInicial La fecha de inicio
    //@param fechaFinal  La fecha de fin
    //@return Retorna el numero de dias entre dos fechas
    public static int diferenciasDeFechasDia(Date fechaInicial, Date fechaFinal) {

        DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM,new Locale(LOCALE_NAME));
        String fechaInicioString = df.format(fechaInicial);
        try {
            fechaInicial = df.parse(fechaInicioString);
        } catch (ParseException ex) {
        }

        String fechaFinalString = df.format(fechaFinal);
        try {
            fechaFinal = df.parse(fechaFinalString);
        } catch (ParseException ex) {
        }

        long fechaInicialMs = fechaInicial.getTime();
        long fechaFinalMs = fechaFinal.getTime();
        long diferencia = fechaFinalMs - fechaInicialMs;
        double dias = Math.floor(diferencia / (1000 * 60 * 60 * 24));
        return ((int) dias);
    }
    
    //Diferencias entre dos fechas
    //@param fechaInicial La fecha de inicio
    //@param fechaFinal  La fecha de fin
    //@return Retorna el numero de dias entre dos fechas
    public static synchronized int diferenciasDeFechasHoras(Date fechaInicial, Date fechaFinal) {
        long fechaInicialMs = fechaInicial.getTime();
        long fechaFinalMs = fechaFinal.getTime();
        long diferencia = fechaFinalMs - fechaInicialMs;
        double minutos = Math.floor(diferencia / (1000 * 60*60 ));
        return ((int) minutos);
    }
  //Diferencias entre dos fechas
    //@param fechaInicial La fecha de inicio
    //@param fechaFinal  La fecha de fin
    //@return Retorna el numero de dias entre dos fechas
    public static synchronized int diferenciasDeFechasHorasMinutos(Date fechaInicial, Date fechaFinal) {

    	 long fechaInicialMs = fechaInicial.getTime();
         long fechaFinalMs = fechaFinal.getTime();
         long diferencia = fechaFinalMs - fechaInicialMs;
         double minutos = Math.floor(diferencia / (1000 * 60 ));
         return ((int) minutos);
    }

    //Devuele un java.util.Date desde un String en formato dd/MM/yyyy
    //@param La fecha a convertir a formato date
    //@return Retorna la fecha en formato Date
    public static synchronized java.util.Date stringToDate(String fecha) {
        SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd/MM/yyyy",new Locale(LOCALE_NAME));
        Date fechaEnviar = null;
        try {
            fechaEnviar = formatoDelTexto.parse(fecha);
            return fechaEnviar;
        } catch (ParseException ex) {
            ex.printStackTrace();
            return null;
        }
    }
    //Devuele un String[] desde un numero de minutos 
    //@param El nroMinutos a convertir a formato Array
    //@return Retorna un array [0]=Dia,[1]=Hora,[2]=Minuto
    public static String[] getDiaHoraMinuto(int nroMinutos) {
        int dia = 0;int hora = 0;
        String[] aux = new String[3];
        while (nroMinutos >= 1440) {
        	nroMinutos -= 1440;
          dia++;
        }
        
        while (nroMinutos >= 60) {
        	nroMinutos -= 60;
          hora++;
        }
        
        if (dia < 10) aux[0] = ("0" + dia); else {
          aux[0] = (dia + "");
        }
        if (hora < 10) aux[1] = ("0" + hora); else {
          aux[1] = (hora + "");
        }
        if (nroMinutos < 10) aux[2] = ("0" + nroMinutos); else {
          aux[2] = (nroMinutos + "");
        }
        return aux;
      }
    
    public static Date getPrimerDiaDelMes() {
    	return getPrimerDiaDelMes(new Date());
    }
    public static Date getUltimoDiaDelMes() {
    	return getUltimoDiaDelMes(new Date());
    }
    public static Date getPrimerDiaDelMes(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.set(cal.get(Calendar.YEAR), 
                cal.get(Calendar.MONTH),
                cal.getActualMinimum(Calendar.DAY_OF_MONTH),
                cal.getMinimum(Calendar.HOUR_OF_DAY),
                cal.getMinimum(Calendar.MINUTE),
                cal.getMinimum(Calendar.SECOND));
        return cal.getTime();
    }
    
    public static Date getUltimoDiaDelMes(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.set(cal.get(Calendar.YEAR),
                cal.get(Calendar.MONTH),
                cal.getActualMaximum(Calendar.DAY_OF_MONTH),
                cal.getMaximum(Calendar.HOUR_OF_DAY),
                cal.getMaximum(Calendar.MINUTE),
                cal.getMaximum(Calendar.SECOND));
        return cal.getTime();
    }

	public static boolean fechasIguales(Date fecha1, Date fecha2) {
		
		return getFecha(fecha1,"yyyyMMdd").equals(getFecha(fecha2,"yyyyMMdd"));
	}
	public static boolean exiteFecha(Date fechaInicio,Date fechaFin, Date fechaBusqueda){
		Integer fechaInicioInt		=Integer.parseInt(getFecha(fechaInicio, "yyyyMMdd"));
		Integer fechaFinInt			=Integer.parseInt(getFecha(fechaFin, "yyyyMMdd"));
		Integer fechaBusquedaInt	=Integer.parseInt(getFecha(fechaBusqueda, "yyyyMMdd"));
		
		return (fechaInicioInt<=fechaBusquedaInt && fechaFinInt>=fechaBusquedaInt);
	}
	
	

	public static int getMinutos(String nroMinutosInicio) {
		String tiempo[]=nroMinutosInicio.split(":");
		return Integer.parseInt(tiempo[0])*60+Integer.parseInt(tiempo[1]);
	}

	public static String getHorario(double nroMinutosFin) {
		String[] etiqueta=getDiaHoraMinuto((int)nroMinutosFin);
		return etiqueta[1]+":"+etiqueta[2];
	}
	
	public static Date setInicioDia(Date date){
		String fecha=DateUtil.getFecha(date,"dd/MM/yyyy");
		return DateUtil.parseDate(fecha+" 00:00:00","dd/MM/yyyy HH:mm:ss");
	}
	public static Date setFinDia(Date date){
		String fecha=DateUtil.getFecha(date,"dd/MM/yyyy");
		return DateUtil.parseDate(fecha+" 23:59:59","dd/MM/yyyy HH:mm:ss");
		
	}
}
